<script setup lang="ts">
import VDialog from "@/components/VDialog/VDialog.vue";
import { useSubmissionHook } from "./utils/hook";
import { computed, reactive, ref } from "vue";
import { SubmissionPageResponse } from "@/api/performance/submission";
import { getAllUsersSimpleApi, type UserSimpleDTO } from "@/api/system/user";
import { Document, Paperclip, User } from "@element-plus/icons-vue";
const { categoryData } = useSubmissionHook();

// 工作量计分办法映射
const scoringRulesMap: Record<string, string> = {
  "论文和学术报告": `1 区 SCI 论文 1 篇记 1000 分，2 区 SCI 论文 1 篇记 700 分，3 区 SCI 论文 1 篇记 400 分，4 区 SCI 论文或 EI 期刊论文 1 篇记 300 分，北大核心论文 1 篇记 200 分，普刊、教改论文和会议论文 1 篇记 100 分。每年最多 5 篇论文可记积分。

参加省部级以上学术会议并做报告 1 次记 60 分，参加校级学术会议并做报告 1 次记 30 分。每年累计不超过 300 分。

论文或学术报告均应以中国民用航空飞行学院为第一署名单位，且以第一作者或通讯作者发表。同一篇论文只计 1 次，如有本学院合作作者，自行协商分配积分。`,
  "科研项目": `国家自然科学基金面上项目 1 项记 6000 分，国家自然科学基金青年项目 1 项记 3000 分，国家自然科学基金重点项目的子课题 1 项记 2000 分，省部级重点基金项目 1 项记 2000 分，省部级基金项目 1 项记 1000 分，厅局级项目 1 项记 500 分，校级重点项目 1 项记 300 分，校级面上项目 1 项记 200 分，校级青年项目 1 项记 100 分，横向项目到账经费每 1 万记 10 分，每一年度横向项目不超过 2000 分。

以上积分均是作为项目负责人得分，并且以中国民用航空飞行学院为第一单位。如有本学院合作者，自行协商分配积分。

项目的级别认定按照学校相关文件执行，同一项目只记 1 次,可以在项目计划周期内分配积分到不同年度。`,
  "教研项目": `国家级教研项目 1 项记 3000 分，省部级教研项目 1 项记 1500 分，校级教研项目 1 项记 200 分。

以上积分均是作为项目负责人得分，并且以中国民用航空飞行学院为第一单位，如有本学院合作者，自行协商分配积分。`,
  "其他科研教研成果": `国家级一等奖 1 项记 3000 分、二等奖 1 项记 1500 分、三等奖 1 项记 1000 分；省部级一等奖 1 项记 800 分、二等奖 1 项记 600 分、三等奖 1 项记 400 分；校级获奖 1 项记 100 分。

授权 1 项发明专利记 800 分，授权 1 项实用新型专利或软件著作权记 100 分。

以上积分均为排名第一得分，并且以中国民用航空飞行学院为第一单位，如有本学院合作者，自行协商分配积分。

出版国家级或省部级学术著作(专著、教材、译著等)1 部记 3000 分，具体分数由参编人员自行协商分配；出版校级学术著作(专著、教材、译著等)1 部记 1500 分，具体分数由参编人员自行协商分配。`,
  "学术兼职": `国家自然基金委评审专家，如果有评审的年度，当年记 200 分；SCI、EI、核心期刊的主编、副主编、编委在任期内，每一年记 100 分；国家级、省部级学术协会的委员及以上，每年记 100 分；每年累计不超过 200 分。`,
  "学科竞赛": `指导理学院学生参加学科竞赛获国家级一等奖 1 项记 1000 分、二等奖 1 项记 800 分、三等奖 1 项记 600 分；获省部级一等奖 1 项记 400 分、二等奖 1 项记 200 分、三等奖 1 项记 100 分。每年最多 4 项获奖可记积分。

在以上育人工作量积分中，指导学生工作如果没有理学院学生，均按 50%积分。学科竞赛获奖参照高校学科竞赛排行榜榜单，非榜单的获奖均按 50%积分。`,
  "学科竞赛组织与培训": `参与学科竞赛的组织、培训和指导，工作量达 16 学时以上记 1 分。`,
  "科研论文": `指导理学院学生发表科研论文 1 篇，学生第一作者记 200 分、学生参与记 100 分，每年累计不超过 200 分。

在以上育人工作量积分中，指导学生工作如果没有理学院学生，均按 50%积分。`,
  "育人工作量-科研项目": `指导理学院学生参与科研项目记 50 分，每年累计不超过 100 分。

在以上育人工作量积分中，指导学生工作如果没有理学院学生，均按 50%积分。`,
  "科研项目申报": `指导理学院学生成功完成申报省部级及以上的科研项目 1 项记 100 分。

在以上育人工作量积分中，指导学生工作如果没有理学院学生，均按 50%积分。`,
  "专利与学术著作": `指导理学院的学生参与专利、获奖等申报工作，参与编写学术著作 (专著、教材、译著等)1 项记 100 分，每年累计不超过 200 分。

在以上育人工作量积分中，指导学生工作如果没有理学院学生，均按 50%积分。`,
  "毕业论文指导": `指导理学院毕业生 1 名，完成毕业论文记 50 分，每年累计不超过 400 分。

在以上育人工作量积分中，指导学生工作如果没有理学院学生，均按 50%积分。`,
  "硕士研究生指导": `指导理学院硕士研究生 1 名，完成相关开题工作记 50 分，完成毕业论文记 100 分，每年累计不超过 500 分。

在以上育人工作量积分中，指导学生工作如果没有理学院学生，均按 50%积分。`,
  "学术会议指导": `指导理学院学生参加国内外重要学术会议并作报告 1 次记 100 分，每年累计不超过 200 分。

在以上育人工作量积分中，指导学生工作如果没有理学院学生，均按 50%积分。`,
  "新教师指导": `指导新教师 1 名，并且完成相关指导工作记 100 分；指导新教师参加省级竞赛并获成功参赛奖 1 项记 100 分，获省级奖励 1 项记 200 分、获国家级奖励 1 项记 300 分，每年累计不超过 300 分。`,
  "服务工作量": `深度参与数学、应用统计、大数据技术与工程硕士点建设，并取得阶段性成果，记 100 分，每年累计不超过 300 分。

深度参与信息与计算科学、数据科学与大数据专业建设，并取得阶段性成果，记 100 分；每年修订人才培养方案，记 200 分。每年累计不超过 300 分。

举办国家级学术或教研会议，覆盖校外人员 10 人以上或重量级专家参会，扩大学院的影响力，记 200 分；举办省级学术或教研会议，覆盖校外人员 5 人以上或重量级专家参会，扩大学院的影响力，记 100 分；邀请知名专家到校开展学术报告，记 50 分。每年累计不超过 300 分。

深度参与实验实训基地建设，并取得阶段性成果，每年累计不超过 2 分。

参与国家级实验室或平台管理，并取得阶段性成果，每年累计不超过 200 分。

参与省级实验室或平台管理，并取得阶段性成果，每年累计不超过 150 分。

参与校级实验室或平台管理，并取得阶段性成果，每年累计不超过 100 分。

实验室的设备管理工作，管理 1 间实验室，且管理实验器材件数大于等于 40 件或实验器材资产大于等于 100 万元，有明确的责任人、资产卡片且当年无安全事故，每年记 100 分。

固定资产超过 2000 万(含)的实验室按照国家级实验室处理；固定资产在 1000 万(含)至 2000 万的实验室按照省级实验室处理；教学实验室按照校级实验室处理，不重复记录。每年仅一项实验室建设或管理参与记分，每年累计不超过 200 分；有建设期的实验室可以按照计划积分，但不能超过单项最高积分。

负责国家级一流课程建设，具有阶段性成果，记 500 分；参与建设 1 门理学院的国家级一流课程(排名前 5)，具有阶段性成果，记 200 分。

负责省级一流课程建设，具有阶段性成果，记 300 分；参与建设 1 门理学院的省级一流课程(排名前 5)，具有阶段性成果，记 150 分。

负责校级一流课程建设，具有阶段性成果，记 200 分；参与建设 1 门理学院的校级一流课程(排名前 5)，具有阶段性成果，记 80 分。

负责 1 门课程的课程建设，具有阶段性成果，记 100 分；参与建设 1 门理学院课程的建设，具有阶段性成果，记 50 分。

阶段性成果一般指上线全网公开的课程资源建设或学院统一安排课程大纲修订、或校级以上一流课程建设或相当课程建设荣誉等。每年不超过两项课程建设参与记分，每年累计不超过 300 分；有建设期的课程可以按照计划积分，但不能超过单项最高积分。

对于承担党政管理工作的专业技术人员，如果按照专业技术岗位考核，其党政管理工作量积分标准如下：在顺利完成全年党政管理工作任务的条件下，院长记 500 分，副院长记 400 分，办公室主任记 300 分，办公室人员(含坐班制度的借调)记 250 分，系、教研室主任记 200 分，副主任记 150 分，党支部书记记 100 分，支部委员记 50 分，纪委委员记 50 分，督导组成员记 100 分，班导师记 100 分，工会委员以及工会小组成员记 50 分。对于承担了学院服务事项的教师，根据服务事项清单实施办法给与相应绩效分数。本项积分最高 500 分。

提供有社会影响力的社会服务工作，有相关的业绩或证书，记 100 分，每年累计不超过 100 分。

为理学院创收(常规工作以外的其他工作，并列入学院创收)，每 2 万元计 100 分。

服务理学院的相关重大事项等，具体工作量和积分由被考核人提出，各系室和基层组织统一上报学院绩效工作领导小组，形成方案后提交党委会审定，原则上不超过 100 分。`
};

// 获取当前子类别的计分办法
const currentScoringRule = computed(() => {
  const subCategory = formData.subCategory;
  const mainCategory = formData.mainCategory;
  if (!subCategory) return "";
  
  // 对于育人工作量下的科研项目，使用特殊key
  if (mainCategory === "育人工作量" && subCategory === "科研项目") {
    return scoringRulesMap["育人工作量-科研项目"] || "";
  }
  
  // 对于服务工作量，使用主类别作为key
  if (mainCategory === "服务工作量") {
    return scoringRulesMap["服务工作量"] || "";
  }
  
  return scoringRulesMap[subCategory] || "";
});

interface Props {
  modelValue: boolean;
  row?: SubmissionPageResponse;
}

const props = defineProps<Props>();
const emits = defineEmits<{
  (e: "update:modelValue", v: boolean): void;
}>();

const visible = computed({
  get: () => props.modelValue,
  set(v) {
    emits("update:modelValue", v);
  }
});

const formData = reactive<Partial<SubmissionPageResponse>>({});

// 额外的动态表单与上传状态
const detailsForm = reactive<Record<string, any>>({});
const uploadedUrls = ref<string[]>([]);
const uploadFileList = ref<any[]>([]);

// 多人参与分配
const isMultiProject = ref<boolean>(false);
// 分配列表（每项：用户与分数）
type AllocationItem = { userId?: number; userLabel?: string; score?: number };
const allocationList = reactive<AllocationItem[]>([]);
// 分配依据（共享一份材料给所有分配）
const allocationEvidenceUploadFiles = ref<any[]>([]);
const allocationEvidenceUrls = ref<string[]>([]);
// 全量简要用户与筛选结果
const allUsers = ref<UserSimpleDTO[]>([]);

async function fetchAllUsersSimple() {
  try {
    const { data } = await getAllUsersSimpleApi();
    allUsers.value = data || [];
  } catch (e) {
    console.error(e);
  }
}

function getUserLabel(u: UserSimpleDTO) {
  const name = u.nickname || "";
  const dept = u.deptName || "";
  return dept ? `${name}（${dept}）` : name;
}

// 从 URL 中提取文件名
function extractFileNameFromUrl(url: string): string {
  if (!url) return "";
  try {
    // 移除查询参数和锚点
    const urlWithoutQuery = url.split("?")[0].split("#")[0];
    // 获取路径的最后一部分
    const pathParts = urlWithoutQuery.split("/");
    const fileName = pathParts[pathParts.length - 1];
    // 解码 URL 编码的文件名
    return decodeURIComponent(fileName);
  } catch (e) {
    // 如果解码失败，返回原始路径的最后一部分
    const pathParts = url.split("/");
    return pathParts[pathParts.length - 1] || "";
  }
}

// 根据子类别/项目类别生成动态字段
type Field = { key: string; label: string; type?: "input" | "number" | "date" | "textarea" | "switch" };
const dynamicFields = computed<Field[]>(() => {
  const sub = (formData.subCategory || "").trim();
  const item = (formData.itemCategory || "").trim();
  if (!sub || !item) return [];

  // 当选择"其他工作量"时的特殊处理
  if (formData.mainCategory === "其他工作量") {
    return [
      { key: "workContent", label: "工作内容描述", type: "textarea" },
      { key: "startDate", label: "开始日期", type: "date" },
      { key: "endDate", label: "结束日期", type: "date" },
      { key: "workResult", label: "工作成果", type: "textarea" },
      { key: "remark", label: "备注", type: "textarea" }
    ];
  }

  // 论文和学术报告
  if (sub === "论文和学术报告") {
    return [
      { key: "paperTitle", label: "论文/报告题目" },
      { key: "journalOrConf", label: "期刊/会议名称" },
      { key: "partition", label: "分区/类别" },
      { key: "publishDate", label: "发表/报告日期", type: "date" },
      { key: "isFirstAffiliation", label: "第一署名单位为中飞行院", type: "switch" },
      { key: "isFirstOrCorresponding", label: "是否第一作者/通讯作者", type: "switch" },
      { key: "authors", label: "作者(按顺序)" }
    ];
  }
  // 科研项目/教研项目
  if (sub === "科研项目" || sub === "教研项目") {
    // 横向项目到账经费单独字段
    if (item.includes("横向项目到账经费")) {
      return [
        { key: "projectName", label: "项目名称" },
        { key: "amountWan", label: "到账经费(万元)", type: "number" },
        { key: "year", label: "到账年度" },
        { key: "isPI", label: "是否项目负责人", type: "switch" },
        { key: "firstUnit", label: "第一单位为中飞院", type: "switch" }
      ];
    }
    return [
      { key: "projectName", label: "项目名称" },
      { key: "projectLevel", label: "项目级别/类别" },
      { key: "projectNo", label: "立项编号" },
      { key: "startDate", label: "开始日期", type: "date" },
      { key: "endDate", label: "结束日期", type: "date" },
      { key: "isPI", label: "是否项目负责人", type: "switch" },
      { key: "firstUnit", label: "第一单位为中飞院", type: "switch" }
    ];
  }
  // 其他科研教研成果
  if (sub === "其他科研教研成果") {
    if (item.includes("专利")) {
      return [
        { key: "patentTitle", label: "专利名称" },
        { key: "patentType", label: "专利类型" },
        { key: "authNo", label: "授权号" },
        { key: "authDate", label: "授权日期", type: "date" },
        { key: "isFirstRank", label: "是否排名第一", type: "switch" },
        { key: "firstUnit", label: "第一单位为中飞院", type: "switch" }
      ];
    }
    if (item.includes("著作")) {
      return [
        { key: "bookTitle", label: "著作名称" },
        { key: "isbn", label: "ISBN/出版编号" },
        { key: "publisher", label: "出版社/出版单位" },
        { key: "pubDate", label: "出版日期", type: "date" }
      ];
    }
    if (item.includes("获奖") || item.includes("奖")) {
      return [
        { key: "awardName", label: "奖项名称" },
        { key: "awardLevel", label: "级别/等级" },
        { key: "awardingBody", label: "授奖单位" },
        { key: "awardDate", label: "获奖日期", type: "date" }
      ];
    }
  }
  // 学术兼职
  if (sub === "学术兼职") {
    return [
      { key: "position", label: "兼职职务" },
      { key: "organization", label: "机构/期刊/协会" },
      { key: "year", label: "年度" }
    ];
  }
  // 育人工作量
  if (formData.mainCategory === "育人工作量") {
    if (sub === "学科竞赛") {
      return [
        { key: "competitionName", label: "竞赛名称" },
        { key: "award", label: "获奖等级" },
        { key: "awardDate", label: "获奖日期", type: "date" },
        { key: "studentNames", label: "学生姓名" }
      ];
    }
    if (sub === "学科竞赛组织与培训") {
      return [
        { key: "activityName", label: "活动名称" },
        { key: "hours", label: "工作量(学时)", type: "number" },
        { key: "date", label: "完成日期", type: "date" }
      ];
    }
    if (sub === "科研论文") {
      return [
        { key: "paperTitle", label: "论文题目" },
        { key: "journal", label: "期刊/会议" },
        { key: "isStudentFirst", label: "学生第一作者", type: "switch" },
        { key: "publishDate", label: "发表日期", type: "date" }
      ];
    }
    if (sub === "科研项目") {
      return [
        { key: "projectName", label: "项目名称" },
        { key: "participation", label: "参与情况/内容" },
        { key: "date", label: "参与日期", type: "date" }
      ];
    }
    if (sub === "科研项目申报") {
      return [
        { key: "projectName", label: "项目名称" },
        { key: "level", label: "级别" },
        { key: "date", label: "申报/立项日期", type: "date" }
      ];
    }
    if (sub === "专利与学术著作") {
      return [
        { key: "title", label: "名称" },
        { key: "type", label: "类型(专利/著作/获奖)" },
        { key: "date", label: "完成日期", type: "date" }
      ];
    }
    if (sub === "毕业论文指导") {
      return [
        { key: "studentName", label: "学生姓名" },
        { key: "topic", label: "论文题目" },
        { key: "finishDate", label: "完成日期", type: "date" }
      ];
    }
    if (sub === "硕士研究生指导") {
      return [
        { key: "studentName", label: "学生姓名" },
        { key: "stage", label: "阶段(开题/毕业)" },
        { key: "date", label: "完成日期", type: "date" }
      ];
    }
    if (sub === "学术会议指导") {
      return [
        { key: "conference", label: "会议名称" },
        { key: "reportTitle", label: "报告题目" },
        { key: "date", label: "报告日期", type: "date" }
      ];
    }
    if (sub === "新教师指导") {
      return [
        { key: "teacherName", label: "新教师姓名" },
        { key: "content", label: "指导内容" },
        { key: "date", label: "完成日期", type: "date" }
      ];
    }
  }
  // 服务工作量（部分通用）
  if (formData.mainCategory === "服务工作量") {
    return [
      { key: "serviceName", label: "服务事项/建设名称" },
      { key: "stageResult", label: "阶段性成果说明", type: "textarea" },
      { key: "date", label: "完成日期", type: "date" }
    ];
  }
  return [];
});

async function handleOpened() {
  // 先加载全量用户用于显示用户名
  await fetchAllUsersSimple();
  
  // 重置状态
  isMultiProject.value = false;
  allocationList.splice(0, allocationList.length);
  allocationEvidenceUrls.value = [];
  allocationEvidenceUploadFiles.value = [];
  
  if (props.row) {
    Object.assign(formData, props.row);
    // 还原详情
    try {
      const json = props.row.detailsJson;
      if (json) {
        const parsed = JSON.parse(json);
        Object.assign(detailsForm, parsed);
        // 优先从 detailsJson 中读取 isMultiProject
        if (Object.prototype.hasOwnProperty.call(parsed, "isMultiProject")) {
          isMultiProject.value = !!parsed.isMultiProject;
        }
      }
    } catch {}
    // 还原文件
    const files = (props.row.fileList || "").split(";").map(s => s.trim()).filter(Boolean);
    uploadedUrls.value = files;
    uploadFileList.value = files.map((url, idx) => {
      const fileName = extractFileNameFromUrl(url);
      return { name: fileName || `证明材料${idx + 1}`, url, status: "success" };
    });
  }
  
  // 只有在 isMultiProject 为 true 时，才还原多人分配数据（兼容旧格式与新格式）
  if (isMultiProject.value) {
    try {
      const alloc = (props.row as any)?.allocationDetails;
      if (alloc) {
        const parsed = JSON.parse(alloc);
        if (Array.isArray(parsed) && parsed.length) {
          // 旧格式：数组，每条含 userId/score/materials
          allocationList.splice(0, allocationList.length, ...parsed.map((it: any) => {
            const user = allUsers.value.find(u => u.userId === it.userId);
            return {
              userId: it.userId,
              userLabel: user ? getUserLabel(user) : undefined,
              score: it.score
            };
          }));
          // 合并所有行的材料作为共享依据
          const merged: string[] = [];
          parsed.forEach((it: any) => {
            (it.materials || []).forEach((u: string) => { if (u && !merged.includes(u)) merged.push(u); });
          });
          allocationEvidenceUrls.value = merged;
          allocationEvidenceUploadFiles.value = merged.map((url, i) => {
            const fileName = extractFileNameFromUrl(url);
            return { name: fileName || `分配依据${i + 1}`, url, status: "success" };
          });
        } else if (parsed && typeof parsed === "object") {
          // 新格式：{ materials: string[], items: [{userId,score}] }
          const items = Array.isArray(parsed.items) ? parsed.items : [];
          allocationList.splice(0, allocationList.length, ...items.map((it: any) => {
            const user = allUsers.value.find(u => u.userId === it.userId);
            return {
              userId: it.userId,
              userLabel: user ? getUserLabel(user) : undefined,
              score: it.score
            };
          }));
          const mats: string[] = Array.isArray(parsed.materials) ? parsed.materials : [];
          allocationEvidenceUrls.value = mats;
          allocationEvidenceUploadFiles.value = mats.map((url, i) => {
            const fileName = extractFileNameFromUrl(url);
            return { name: fileName || `分配依据${i + 1}`, url, status: "success" };
          });
        }
      }
    } catch {}
  }
}

// 格式化显示值
function formatValue(value: any, field: Field): string {
  if (value === undefined || value === null || value === "") return "-";
  if (field.type === "switch") {
    return value === true || value === "true" ? "是" : "否";
  }
  if (field.type === "date") {
    return value || "-";
  }
  return String(value);
}
</script>

<template>
  <v-dialog
    show-full-screen
    :fixed-body-height="false"
    use-body-scrolling
    title="绩效上报详情"
    v-model="visible"
    :show-footer="false"
    @cancel="visible = false"
    @opened="handleOpened"
    @confirm="visible = false"
  >
    <div class="detail-container">
      <!-- 基本信息卡片 -->
      <el-card class="detail-card" shadow="never">
        <template #header>
          <div class="card-header">
            <span class="card-title">基本信息</span>
          </div>
        </template>
        <el-descriptions :column="2" border>
          <el-descriptions-item label="考核年度" :span="1">
            <el-tag type="info" size="default">{{ formData.assessmentYear || "-" }}</el-tag>
          </el-descriptions-item>
          <el-descriptions-item label="主类别" :span="1">
            <el-tag type="info" size="default">{{ formData.mainCategory || "-" }}</el-tag>
          </el-descriptions-item>
          <el-descriptions-item label="子类别" :span="1">
            <span class="detail-text">{{ formData.subCategory || "-" }}</span>
          </el-descriptions-item>
          <el-descriptions-item label="项目类别" :span="1">
            <span class="detail-text">{{ formData.itemCategory || "-" }}</span>
          </el-descriptions-item>
          <el-descriptions-item label="标题" :span="2">
            <span class="detail-text title-text">{{ formData.title || "-" }}</span>
          </el-descriptions-item>
          <el-descriptions-item label="申请总分数" :span="1">
            <el-tag type="success" size="large" effect="dark">
              {{ formData.userReportedScore || "0" }} 分
            </el-tag>
          </el-descriptions-item>
          <el-descriptions-item label="是否多人参与" :span="1">
            <el-tag :type="isMultiProject ? 'warning' : 'info'" size="default">
              {{ isMultiProject ? "是" : "否" }}
            </el-tag>
          </el-descriptions-item>
        </el-descriptions>
      </el-card>

      <!-- 工作量计分办法卡片 -->
      <el-card v-if="currentScoringRule" class="detail-card" shadow="never">
        <template #header>
          <div class="card-header">
            <span class="card-title">工作量计分办法</span>
          </div>
        </template>
        <div class="scoring-rule-content">{{ currentScoringRule }}</div>
      </el-card>

      <!-- 项目详情卡片 -->
      <el-card v-if="dynamicFields.length" class="detail-card" shadow="never">
        <template #header>
          <div class="card-header">
            <span class="card-title">项目详情</span>
          </div>
        </template>
        <el-descriptions :column="2" border>
          <el-descriptions-item
            v-for="field in dynamicFields"
            :key="field.key"
            :label="field.label"
            :span="field.type === 'textarea' ? 2 : 1"
          >
            <span class="detail-text" :class="{ 'textarea-text': field.type === 'textarea' }">
              {{ formatValue(detailsForm[field.key], field) }}
            </span>
          </el-descriptions-item>
        </el-descriptions>
      </el-card>

      <!-- 证明材料卡片 -->
      <el-card class="detail-card" shadow="never">
        <template #header>
          <div class="card-header">
            <span class="card-title">证明材料</span>
            <el-tag v-if="uploadFileList.length > 0" type="info" size="small">
              {{ uploadFileList.length }} 个文件
            </el-tag>
          </div>
        </template>
        <div v-if="uploadFileList.length > 0" class="file-list">
          <div v-for="(file, idx) in uploadFileList" :key="idx" class="file-item">
            <el-icon class="file-icon"><Document /></el-icon>
            <el-link :href="file.url" target="_blank" type="primary" :underline="false" class="file-link">
              {{ file.name || `证明材料${idx + 1}` }}
            </el-link>
          </div>
        </div>
        <el-empty v-else description="暂无证明材料" :image-size="80" />
      </el-card>

      <!-- 多人参与分配卡片 -->
      <el-card v-if="isMultiProject" class="detail-card" shadow="never">
        <template #header>
          <div class="card-header">
            <span class="card-title">多人参与分配</span>
            <el-tag type="warning" size="small">{{ allocationList.length }} 位成员</el-tag>
          </div>
        </template>

        <!-- 分配依据 -->
        <div class="allocation-section">
          <div class="section-title">
            <el-icon><Paperclip /></el-icon>
            <span>分配依据</span>
          </div>
          <div v-if="allocationEvidenceUploadFiles.length > 0" class="file-list">
            <div v-for="(file, idx) in allocationEvidenceUploadFiles" :key="idx" class="file-item">
              <el-icon class="file-icon"><Document /></el-icon>
              <el-link :href="file.url" target="_blank" type="primary" :underline="false" class="file-link">
                {{ file.name || `分配依据${idx + 1}` }}
              </el-link>
            </div>
          </div>
          <el-empty v-else description="暂无分配依据" :image-size="60" />
        </div>

        <!-- 分配列表 -->
        <div class="allocation-section">
          <div class="section-title">
            <el-icon><User /></el-icon>
            <span>成员分配</span>
          </div>
          <div class="allocation-list">
            <el-card
              v-for="(row, idx) in allocationList"
              :key="idx"
              class="allocation-item"
              shadow="hover"
            >
              <div class="allocation-content">
                <div class="member-info">
                  <el-avatar :size="40" class="member-avatar">
                    {{ (row.userLabel || "").charAt(0) || "?" }}
                  </el-avatar>
                  <div class="member-details">
                    <div class="member-name">
                      {{ row.userLabel || (allUsers.find(u => u.userId === row.userId) ? getUserLabel(allUsers.find(u => u.userId === row.userId)!) : (row.userId ? `用户ID: ${row.userId}` : "-")) }}
                    </div>
                    <div class="member-index">{{ idx === 0 ? '项目负责人' : `成员 ${idx + 1}` }}</div>
                  </div>
                </div>
                <div class="score-info">
                  <div class="score-label">分配分数</div>
                  <el-tag type="success" size="large" effect="dark" class="score-tag">
                    {{ row.score ?? "0" }} 分
                  </el-tag>
                </div>
              </div>
            </el-card>
          </div>
        </div>
      </el-card>
    </div>
  </v-dialog>
</template>

<style scoped>
.detail-container {
  padding: 0;
}

.detail-card {
  margin-bottom: 20px;
  border-radius: 8px;
  transition: all 0.3s ease;
}

.detail-card:last-child {
  margin-bottom: 0;
}

.detail-card:hover {
  box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}

.card-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-weight: 600;
}

.card-title {
  font-size: 16px;
  color: var(--el-text-color-primary);
  font-weight: 600;
}

/* 描述列表样式优化 */
:deep(.el-descriptions) {
  margin-top: 0;
}

:deep(.el-descriptions__label) {
  font-weight: 500;
  color: var(--el-text-color-regular);
  background-color: var(--el-fill-color-lighter);
}

:deep(.el-descriptions__content) {
  color: var(--el-text-color-primary);
}

.detail-text {
  color: var(--el-text-color-primary);
  word-break: break-word;
}

.title-text {
  font-size: 15px;
  font-weight: 500;
}

.textarea-text {
  white-space: pre-wrap;
  line-height: 1.6;
}

/* 文件列表样式 */
.file-list {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.file-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 12px;
  background-color: var(--el-fill-color-lighter);
  border-radius: 6px;
  transition: all 0.2s ease;
}

.file-item:hover {
  background-color: var(--el-fill-color);
}

.file-icon {
  font-size: 18px;
  color: var(--el-color-primary);
  flex-shrink: 0;
}

.file-link {
  font-size: 14px;
  flex: 1;
}

/* 多人分配区域样式 */
.allocation-section {
  margin-bottom: 24px;
}

.allocation-section:last-child {
  margin-bottom: 0;
}

.section-title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 15px;
  font-weight: 600;
  color: var(--el-text-color-primary);
  margin-bottom: 16px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--el-border-color-lighter);
}

.section-title .el-icon {
  font-size: 18px;
  color: var(--el-color-primary);
}

.allocation-list {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 16px;
}

.allocation-item {
  border-radius: 8px;
  transition: all 0.3s ease;
}

.allocation-item:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.12);
}

.allocation-content {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
}

.member-info {
  display: flex;
  align-items: center;
  gap: 12px;
  flex: 1;
  min-width: 0;
}

.member-avatar {
  flex-shrink: 0;
  background: linear-gradient(135deg, var(--el-color-primary) 0%, var(--el-color-primary-light-3) 100%);
  color: #fff;
  font-weight: 600;
}

.member-details {
  flex: 1;
  min-width: 0;
}

.member-name {
  font-size: 15px;
  font-weight: 500;
  color: var(--el-text-color-primary);
  margin-bottom: 4px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.member-index {
  font-size: 12px;
  color: var(--el-text-color-secondary);
}

.score-info {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 6px;
  flex-shrink: 0;
}

.score-label {
  font-size: 12px;
  color: var(--el-text-color-secondary);
}

.score-tag {
  font-size: 16px;
  padding: 6px 12px;
}

/* 空状态样式 */
:deep(.el-empty) {
  padding: 40px 0;
}

:deep(.el-empty__description) {
  color: var(--el-text-color-secondary);
}

/* 响应式设计 */
@media (max-width: 768px) {
  .allocation-list {
    grid-template-columns: 1fr;
  }

  .allocation-content {
    flex-direction: column;
    align-items: flex-start;
  }

  .score-info {
    align-items: flex-start;
    width: 100%;
  }

  :deep(.el-descriptions) {
    --el-descriptions-table-border: 1px solid var(--el-border-color-lighter);
  }
}

/* 标签样式优化 */
:deep(.el-tag) {
  border-radius: 4px;
}

/* 卡片头部样式 */
:deep(.el-card__header) {
  padding: 16px 20px;
  border-bottom: 1px solid var(--el-border-color-lighter);
  background-color: var(--el-fill-color-extra-light);
}

:deep(.el-card__body) {
  padding: 20px;
}

/* 计分办法内容样式 */
.scoring-rule-content {
  white-space: pre-wrap;
  line-height: 1.8;
  color: var(--el-text-color-primary);
  font-size: 14px;
}
</style>

